using UnityEngine;
using System.Collections;

/// <summary>
///Classe que deverá ser usada para Objetos 2D Simples 
/// </summary>
public class Sprite2D
{
	#region Atributos

	private Texture textura;

	private Vector2 position;
	private Vector2 escala;

	private float rotacao;

	private Color cor;

	private int largura;
    private int altura;

	#endregion 

    #region Construtor

    public Sprite2D()
    { }
    
    /// <summary>
    /// Construtor
    /// </summary>
    /// <param name="caminho">Caminho da imagem</param>
    /// <param name="posicao">Posição inicial da imagem</param>
    public Sprite2D(string caminho, Vector2 posicao)
    {
       InicializarVariaveis(caminho, posicao);
    }

    #endregion 

    #region Propriedades

    public Texture Textura
    {
        set
        {
            textura = value;

            if (textura != null)
            {
                largura = textura.width;
                altura = textura.height;
            }
        }
        get { return textura; }
    }

    public int Largura
    {
        set { largura = value; }
        get { return largura; }
    }

    public int Altura
    {
        set { altura = value; }
        get { return altura; }
    }

    public Vector2 Position
    {
        set { position = value; }
        get { return position; }
    }

    public Vector2 Escala
    {
        set { escala = value; }
        get { return escala; }
    }

    public float Rotacao
    {
        set { rotacao = value; }
        get { return rotacao; }
    }

    public Color Cor
    {
        set { cor = value; }
        get { return cor; }
    }

    public float Alfa
    {
        set { cor.a = value; }
        get { return cor.a; }
    }

    #endregion 

    #region Draw

    /// <summary>
	///Desenha textura simples 
	/// </summary>
	public void Draw()
	{
        GUI.color = cor;
        GUI.DrawTexture(new Rect(position.x, position.y, (int)largura * escala.x, (int)altura * escala.y), textura);
        GUI.color = new Color(1, 1, 1, 1);
	}

	/// <summary>
	/// Desenha com rotação alterando origem de desenho
	/// </summary>
	public void Draw(Vector2 rotacaoOrigem)
	{
		GUIUtility.RotateAroundPivot(rotacao, rotacaoOrigem);
	    Draw();
		GUIUtility.RotateAroundPivot(-rotacao, rotacaoOrigem);
	}

    /// <summary>
    /// Desenha com o retangulo dado
    /// </summary>
    /// <param name="rect"></param>
    public void Draw(Rect rect)
    {
        GUI.color = cor;
        GUI.DrawTextureWithTexCoords(new Rect(position.x, Position.y, largura * escala.x * rect.width, altura * escala.y * rect.height), textura, rect);
        GUI.color = new Color(1, 1, 1, 1);
    }

    /// <summary>
    /// Desenha a imagem espelhada de acordo com o eixo passado
    /// </summary>
    /// <param name="atX"></param>
    public void DrawMirrorImage(bool atX)
    {
        Rect rect;

        if(atX)
        {
           rect = new Rect(Constantes.TELA_LARGURA - position.x, position.y, -(int)largura * escala.x, (int)altura * escala.y);
        }
        else
        {
           rect = new Rect( position.x, Constantes.TELA_ALTURA - position.y, (int)largura * escala.x, -(int)altura * escala.y);
        }

        GUI.color = cor;
        GUI.DrawTexture(rect, textura);
        GUI.color = new Color(1, 1, 1, 1);
    }

    /// <summary>
    /// Desenha a imagem espelhada de acordo com o eixo passado com rotacao
    /// </summary>
    /// <param name="atX"></param>
    public void DrawMirrorImage(bool atX, Vector2 rotacaoOrigem)
    {
        Rect rect;

        if (atX)
        {
            rect = new Rect(Constantes.TELA_LARGURA - position.x, position.y, -(int)largura * escala.x, (int)altura * escala.y);
        }
        else
        {
            rect = new Rect(position.x, Constantes.TELA_ALTURA - position.y, (int)largura * escala.x, -(int)altura * escala.y);
        }
        GUIUtility.RotateAroundPivot(rotacao, rotacaoOrigem);
        GUI.color = cor;
        GUI.DrawTexture(rect, textura);
        GUI.color = new Color(1, 1, 1, 1);
        GUIUtility.RotateAroundPivot(rotacao, -rotacaoOrigem);
    }
    
    #endregion 

    #region Métodos

    /// <summary>
	///Deve ser chamado para inicializar as variaveis
	/// </summary>
	public void InicializarVariaveis(string caminho, Vector2 posicao)
	{
		//Carregando a textura
		textura = Resources.Load(caminho) as Texture;
		
		//se for null, da erro!
        if (textura == null)
            Debug.LogError("Erro ao carregar Textura - Caminho: " + caminho);
        
		//Redefine o tamnho para o tamanho do quadro atual
		RedefineTamanho();
		
		//Redefine a posicao
        this.position = posicao;
		
		//Redefine a escala
        escala = new Vector2(1, 1);
		
		//Redefinindo a rotação
        rotacao = 0;
		
		//Redefinindo a cor padrao
        cor = new Color(1, 1, 1, 1);	
	}

    public bool SimpleCollision(Vector2 point)
    {
        Rect r = new Rect(position.x, position.y, largura, altura);

        return (point.x >= r.left && point.x <= r.right &&
           point.y >= r.top && point.y <= r.bottom);
    }

    /// <summary>
    /// Usado para pegar o tamanho do quadro atual!!
    /// </summary>
    private void RedefineTamanho()
    {
        largura = textura.width;
        altura = textura.height;
    }
		
	#endregion 
}

